package library.frame;

import library.logic.ManagementSystem;
import library.logic.Tema;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Vector;

/**
 * User: RockCrazy
 * Date: 03.01.12
 * Time: 1:37
 */
public class WinTema extends JDialog implements ActionListener
{
	// Владелец нашего окна - вводим для вызова нужного нам метода
	private MainFrame owner;

	// Результат нажатия кнопок
	private boolean result = false;

	// Параметры темы
	private int temaId = 0;
	private JTextField temaName = new JTextField();

	// Параметры окна
	private static final int D_HEIGHT = 550;    // высота окна
	private final static int D_WIDTH = 450;     // ширина окна
	private final static int L_X = 10;          // левая граница метки для поля
	private final static int L_W = 100;         // ширина метки для поля
	private final static int C_W = 150;         // ширина поля
	private ManagementSystem ms;
	private JTable temasTab;

	/**
	 * @param newTema знак добавления читателя или исправление
	 * @param owner родительская форма
	 */
	public WinTema(boolean newTema, MainFrame owner)
	{
		// После вставки читателя без закрытия окна нам потребуется перегрузка списка
		// А для этого нам надо иметь доступ к этому методу в главной форме
		this.owner = owner;
		try
		{
			ms = new ManagementSystem();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		// Установить заголовок
		setTitle("Информация о Темах");

		// Не будем использовать layout совсем
		getContentPane().setLayout(null);

		// Разместим компоненты по абсолютным координатам

		// Наименование
		JLabel lName = new JLabel("Наименование:", JLabel.RIGHT);
		lName.setBounds(L_X, 10, L_W, 20);
		getContentPane().add(lName);
		temaName.setBounds(L_X + L_W + 10, 10, C_W, 20);
		getContentPane().add(temaName);

		// Создаем таблицу для вывода списка клиентов
		temasTab = new JTable(1, 5);
		temasTab.getSelectionModel().addListSelectionListener(new RowListener());
		reloadTemas();
		JScrollPane scrollPane = new JScrollPane(temasTab);
		scrollPane.setBounds(L_X, 210, 420, 300);
		getContentPane().add(scrollPane);


		JButton btnCancel = new JButton("Выход");
		btnCancel.setName("Выход");
		btnCancel.addActionListener(this);
		btnCancel.setBounds(L_X + L_W + C_W + 10 + 50, 43, 100, 25);
		getContentPane().add(btnCancel);

		// если newTema = true
		if (newTema)
		{
			JButton btnOk = new JButton("OK");
			btnOk.setName("OK");
			btnOk.addActionListener(this);
			btnOk.setBounds(L_X + L_W + C_W + 10 + 50, 10, 100, 25);
			getContentPane().add(btnOk);

			JButton btnNew = new JButton("Еще");
			btnNew.setName("Еще");
			btnNew.addActionListener(this);
			btnNew.setBounds(L_X + L_W + C_W + 10 + 50, 73, 100, 25);
			getContentPane().add(btnNew);
		}
		// если newTema = false
		else
		{
			JOptionPane.showMessageDialog(this, "<html><font color=red>Внимание! Включен режим редактирования!");
			JButton btnDel = new JButton("<html><font color=red>Delete");
			btnDel.setName("Удалить");
			btnDel.addActionListener(this);
			btnDel.setBounds(L_X + L_W + C_W + 10 + 50, 10, 100, 25);
			getContentPane().add(btnDel);

			setTitle("Редактирование тем");
			JButton btnSave = new JButton("Сохранить");
			btnSave.setName("Сохранить");
			btnSave.addActionListener(this);
			btnSave.setBounds(L_X + L_W + C_W + 10 + 50, 73, 100, 25);
			getContentPane().add(btnSave);
		}

		// Устанавливаем поведение формы при закрытии - не закрывать совсем.
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);

		// Получаем размеры экрана
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		// А теперь просто помещаем его по центру, вычисляя координаты на основе полученной информации
		setBounds(((int) d.getWidth() - WinTema.D_WIDTH) / 2, ((int) d.getHeight() - WinTema.D_HEIGHT) / 2, WinTema.D_WIDTH, WinTema.D_HEIGHT);

	}

	// Получить результат, true - кнопка ОК, false - кнопка Cancel
	public boolean getResult()
	{
		return result;
	}

	// Установить поля соответственно переданным данным о теме
	public void setTema(Tema tema)
	{
		temaId = tema.getTemaId();
		temaName.setText(tema.getTemaName());
	}

	// Вернуть данные в виде новой темы с соотвтествующими полями
	public Tema getTema()
	{
		Tema tema = new Tema();
		tema.setTemaId(temaId);
		tema.setTemaName(temaName.getText());

		return tema;
	}

	public void actionPerformed(ActionEvent aE)
	{
		JButton src = (JButton) aE.getSource();
		// Добавляем читателя, но не закрываем окно
		// Здесь мы не будем вызывать в отдельном потоке сохранение.
		// Оно не занимает много времени и лишние действия здесь не оправданы
		if (src.getName().equals("Еще"))
		{
			result = true;
			try
			{
				ManagementSystem.getInstance().insertTema(getTema());
				reloadTemas();
				temaName.setText("");
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(this, sql_e.getMessage());
			}
			return;
		}
		if (src.getName().equals("Сохранить"))
		{
			result = true;
			try
			{
				ManagementSystem.getInstance().updateTema(getTema());
				reloadTemas();
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(this, sql_e.getMessage());
			}
			return;
		}
		if (src.getName().equals("Удалить"))
		{

			result = true;
			deleteTema();
			temaName.setText("");
			return;

		}

		// Смена ФЛАГА
		if (src.getName().equals("OK"))
		{
			result = true;
		}
		if (src.getName().equals("Выход"))
		{
			result = false;
		}
		setVisible(false);
	}

	// метод для удаления темы
	private void deleteTema()
	{
		try
		{
			ms = new ManagementSystem();
			Thread t = new Thread()
			{
				public void run()
				{
					if (temasTab != null)
					{
						TemaTableModel stm = (TemaTableModel) temasTab.getModel();
						// Проверяем - выделен ли хоть какой-нибудь читатель
						if (temasTab.getSelectedRow() >= 0)
						{
							if (JOptionPane.showConfirmDialog(WinTema.this,
									"<html><font color=red>Вы хотите удалить тему?", "Удаление удаление",
									JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
							{
								Tema tema = stm.getTema(temasTab.getSelectedRow());
								try
								{
									ms.deleteTema(tema);
									reloadTemas();
								}
								catch (SQLException e)
								{
									JOptionPane.showMessageDialog(WinTema.this, e.getMessage());
								}
							}
						} // Если читатель не выделен - сообщаем пользователю, что это необходимо
						else
						{
							JOptionPane.showMessageDialog(WinTema.this, "Необходимо выделить тему в списке");
						}

					}
				}
			};
			t.start();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * Метод для обеспечения интерфейса ListSelectionListener
 	 */
	public void valueChanged(ListSelectionEvent e)
	{
		if (!e.getValueIsAdjusting())
		{
			reloadTemas();
		}

	}

	/**
	 *  метод для обновления списка ЧИТАТЕЛЕЙ
	 */
	public void reloadTemas()
	{
		// Создаем анонимный класс для потока
		Thread t = new Thread()
		{
			// Переопределяем в нем метод run
			public void run()
			{
				if (temasTab != null)
				{
					try
					{
						// Получаем список читателей
						Collection<Tema> colTem = ms.getTems();
						// И устанавливаем модель для таблицы с новыми данными
						temasTab.setModel(new TemaTableModel(new Vector<Tema>(colTem)));
					}
					catch (SQLException e)
					{
						JOptionPane.showMessageDialog(WinTema.this, e.getMessage());
					}
				}
			}
		};
		// И теперь мы запускаем наш поток
		t.start();
	}

	/**
	 * Метод для обеспечения интерфейса ChangeListener
	 * @param e
	 */
	public void stateChanged(ChangeEvent e)
	{
		reloadTemas();
	}

	/**
	 * Метод слушателя строк`
	 */
	private class RowListener implements ListSelectionListener
	{

		public void valueChanged(ListSelectionEvent event)
		{
			TemaTableModel ctm = (TemaTableModel) temasTab.getModel();
			Tema tema = ctm.getTema(temasTab.getSelectedRow());

			if (event.getValueIsAdjusting())
			{
				return;
			}
			try
			{
				setTema(tema);
			}
			catch (Exception sql_e)
			{
				JOptionPane.showMessageDialog(WinTema.this, "Данные успешно сохранены");
			}
		}
	}
}
